package com.priox.sigar.infraestructura.services;


import com.mm.support.mapper.DTOMapperService;
import com.priox.sigar.client.dto.AcreedorDTO;
import com.priox.sigar.client.flt.AcreedorFlt;
import com.priox.sigar.domain.model.Acreedor;
import com.priox.sigar.domain.model.AcreedorRepository;
import com.priox.sigar.domain.model.SociedadRepository;
import com.priox.sigar.domain.service.AcreedorService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

/**
 * User: allona
 * Date: 15/05/12
 */
@Service
public class AcreedorServiceImpl implements AcreedorService {

    @Autowired
    AcreedorRepository acreedorRepository;

    @Autowired
    SociedadRepository sociedadRepository;

    @Autowired
    private DTOMapperService mapperService;

    public List<Acreedor> findByIds(List<String> ids) {
        return acreedorRepository.findByIds(ids);
    }

    public List<AcreedorDTO> findAll() {
        List<Acreedor> cadenas = acreedorRepository.findAll();
        List<AcreedorDTO> resultado = new ArrayList<AcreedorDTO>();

        for (Acreedor model : cadenas) {
            AcreedorDTO dto = mapperService.map(model, AcreedorDTO.class);
            resultado.add(dto);
        }
        return resultado;
    }

    public List<Acreedor> findAllCadenas() {
        return acreedorRepository.findAll();
    }

    public List<AcreedorDTO> findByFilter(AcreedorFlt filtro) {
        return acreedorRepository.findByFilter(filtro);
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void save(AcreedorDTO cadenaDTO, boolean updateMode) {
        Acreedor entity = mapperService.map(cadenaDTO, Acreedor.class);
        if (updateMode) {
            acreedorRepository.merge(entity);
        } else {
            acreedorRepository.persist(entity);
        }
//        acreedorRepository.saveAcreedorSociedad(entity.getAcreedorId(), new ArrayList<SociedadDTO>(cadenaDTO.getSociedades()));

    }

    @Transactional
    public void saveSimple(AcreedorDTO cadenaDTO, boolean updateMode) {

        Acreedor entity = mapperService.map(cadenaDTO, Acreedor.class);

        if (updateMode) {
            acreedorRepository.merge(entity);
        } else {
            acreedorRepository.persist(entity);
        }
    }

    @Transactional
    public void update(AcreedorDTO anterior) {
        Acreedor cadena = mapperService.map(anterior, Acreedor.class);
        acreedorRepository.merge(cadena);
    }


    @Transactional
    public List<Acreedor> findByRUC(String ruc) {
        List<Acreedor> list = new ArrayList<Acreedor>();
        if (ruc != null) {
            list = acreedorRepository.findByRUC(ruc);
        }
        return list;
    }

    public void delete(AcreedorDTO nuevoRegistro) {
//        acreedorRepository.delete(nuevoRegistro.getId());
    }

    public void executeSP() {
        acreedorRepository.executeSP();
    }
}
